package edu.northwestern.cbits.purple_robot_manager.probes.features.p20; import java.util.List; import java.util.ArrayList; import edu.emory.mathcs.backport.java.util.Arrays; import android.util.Log; public class Clip { public static final int ACCELEROMETER = 1; public static final int GYROSCOPE = 2; public static final int BAROMETER = 3; private List<double[]> _values; private List<Long> _timestamps; private int _dimensions = -1; private long _windowSize = -1; private int _clipType = -1; public Clip(int dimension, long windowSize, int clipType) { this._values = new ArrayList<>(); this._timestamps = new ArrayList<>(); this._dimensions = dimension; this._windowSize = windowSize; this._clipType = clipType; } // Copy Constructor public Clip(Clip another) { this._values = new ArrayList<>(another._values); this._timestamps = new ArrayList<>(another._timestamps); this._dimensions = another._dimensions; this._windowSize = another._windowSize; this._clipType = another._clipType; } public static class ClipException extends Exception { private static final long serialVersionUID = 2813224970919166162L; public ClipException(String message) { super(message); } } public void appendValues(double[] values, long timestamp) throws ClipException { if (values.length != this._dimensions) { throw new ClipException("Dimensions do not match. Received " + values.length + ", expected " + this._dimensions + "."); } else { synchronized (this) { if (this._timestamps.size() == 0) { this.pushValues(values, timestamp); } else { Long first = this._timestamps.get(0); while ((timestamp - first > this._windowSize) && (this._timestamps.size() > 1)) { this._timestamps.remove(0); this._values.remove(0); first = this._timestamps.get(0); } if (timestamp - first > this._windowSize) { // Clear values if gap larger than _windowSize... this._values.clear(); this._timestamps.clear(); Log.e("PR", "Clip: There has been a gap longer than " + this._windowSize + "ms."); } this.pushValues(values, timestamp); } } } } private void pushValues(double[] values, long timestamp) { synchronized (this) { this._timestamps.add(timestamp); this._values.add(Arrays.copyOf(values, values.length)); } } public List<double[]> getValues() { List<double[]> values = new ArrayList<>(); synchronized (this) { values.addAll(this._values); } return values; } public List<Long> getTimestamps() { List<Long> timestamps = new ArrayList<>(); synchronized (this) { timestamps.addAll(this._timestamps); } return timestamps; } public long getLastTimestamp() { long timestamp = 0; synchronized (this) { timestamp = this._timestamps.get(this._timestamps.size() - 1); } return timestamp; } public int getType() { return this._clipType; } }